#pragma once

/*
 * 用于数据持久化操作
 * 保存和读取 raft 协议相关的状态数据以及快照数据
 */

#include <mutex>
#include <string>

#include "bq_log/bq_log.h"

namespace raft::utils {
    class Persistence {
    public:
        explicit Persistence(const std::string &me);

        ~Persistence() = default;

        // 保存 raft 状态和状态机快照数据到本地
        bool save(const std::string &raft_state, const std::string &snapshot);

        // 保存 raft 状态数据
        bool save_raft_state(const std::string &data);

        // 返回从本地文件读取的状态数据
        std::string read_raft_state();

        // 返回从本地文件读取的快照数据
        std::string read_snapshot();

        // 获取当前 raft 状态数据大小
        [[nodiscard]] long long get_raft_state_size() const;

    private:
        std::mutex mutex_;
        const std::string raft_state_file_name_;
        const std::string snapshot_file_name_;
        // 记录当前 raft 状态数据大小，避免每次读取文件获取大小，起缓存作用
        long long raft_state_size_;

        bq::log log;
    };
}// namespace raft::utils